跳到主要内容

向量数据库的概念

Embedding 是什么?

在看向量数据库之前先来看看 Embedding 是什么

在计算机科学和自然语言处理中,"Embedding"(嵌入)是指将离散的对象(如单词、句子或图像)映射到连续向量空间的过程。嵌入向量是一种表示,其中每个对象被表示为一个固定长度的实数向量。

当谈到嵌入时,一个常见的例子是单词嵌入。在自然语言处理中,我们可以使用单词嵌入来将单词映射到连续的向量空间。

假设我们有以下几个句子:

  1. "I enjoy playing football."
  2. "I like watching movies."
  3. "I love eating pizza."

我们可以通过训练一个神经网络模型来学习单词嵌入。模型会学习将每个单词映射到一个向量,以捕捉它们的语义和语法特征。

训练完成后,我们可以得到一些单词嵌入向量,例如:

"enjoy":   [0.2, -0.3, 0.5]
"playing": [-0.1, 0.4, -0.2]
"football":[0.6, 0.1, -0.4]
"like": [-0.5, 0.2, 0.3]
"watching":[-0.2, 0.5, 0.1]
"movies": [0.3, -0.4, 0.2]
"love": [0.1, 0.6, -0.3]
"eating": [0.4, -0.1, 0.2]
"pizza": [0.2, 0.3, -0.5]

通过这样的单词嵌入,我们可以计算句子或单词之间的相似性。例如,我们可以使用余弦相似度来计算两个单词嵌入向量之间的相似性,从而找到语义上相关的单词。

例如,计算"football"和"playing"之间的余弦相似度,结果可能很高,因为它们在语义上相关。而计算"football"和"movies"之间的余弦相似度,结果可能较低,因为它们在语义上没有明显的关联。

这就是嵌入的基本思想,通过将离散的对象映射到连续的向量空间,我们可以利用这些嵌入向量来进行各种任务,如文本分类、情感分析、推荐系统等。

Embedding 是如何映射出来的?

看了上面的解释后,那么怎么把这些单词映射到具体的向量呢?

神经网络模型(如 Word2Vec)之所以能够训练出单词嵌入向量,是因为它们利用了大量的上下文信息和目标预测任务来学习单词的分布式表示。这种分布式表示的特点是相似的单词在向量空间中的位置也相近。

在 Word2Vec 模型中,通过预测目标单词的上下文单词来学习嵌入向量。当模型进行训练时,它会调整嵌入向量的值,使得模型能够更准确地预测上下文单词。在这个过程中,模型学习到了单词之间的语义和语法关系,并将这些关系编码为嵌入向量。

具体来说,当模型预测上下文单词时,它会计算目标单词嵌入向量与上下文单词嵌入向量之间的相似度。通过调整嵌入向量的值,模型试图最大化正确预测上下文单词的概率。这个过程使用了梯度下降等优化算法,通过迭代训练来更新嵌入向量的值。

通过大规模的训练数据和适当的模型架构,模型能够学习到单词之间的语义和语法特征。相似的单词在向量空间中会有相似的表示,因此可以用嵌入向量来衡量单词之间的相似性。

将单词映射到具体的向量通常需要使用神经网络模型进行训练。其中,最常用的模型之一是 Word2Vec 模型。

Word2Vec 模型有两个主要的变体:

  • 跳字模型(Skip-gram);
  • 连续词袋模型(Continuous Bag-of-Words,简称CBOW)。

这两种变体的核心思想都是通过预测周围的上下文单词来学习单词的嵌入向量。

以跳字模型为例,训练过程如下:

  1. 建立一个神经网络模型,输入是一个目标单词和其周围的上下文单词。
  2. 使用一个隐藏层来学习目标单词的嵌入向量。
  3. 在训练过程中,模型通过最大化正确预测上下文单词的概率来更新嵌入向量。
  4. 重复上述步骤,直到完成所有单词的训练。

在训练完成后,我们可以提取出隐藏层的权重作为单词的嵌入向量。这些嵌入向量将具有一定的语义信息,可以表示单词之间的关系。

提示

在神经网络中,隐藏层(hidden layer)是指位于输入层和输出层之间的一层或多层神经元组成的层。隐藏层的名称来源于它的输出对于外部观察者来说是“隐藏”的,因为我们无法直接观察到隐藏层的输出。

隐藏层的主要功能是对输入数据进行非线性转换和特征提取。每个隐藏层的神经元接收上一层(通常是输入层或前一个隐藏层)的输出作为输入,并通过激活函数对输入进行处理。激活函数引入了非线性性质,使得神经网络能够学习和表示更加复杂的函数关系。

另外,还可以使用预训练的单词嵌入模型,如 GloVe、FastText 和 BERT 等。这些模型在大规模的语料库上进行了训练,并提供了预训练的单词嵌入向量。你可以直接使用这些预训练的向量,而无需自己训练模型。

对于更复杂的嵌入任务,例如将句子或文档映射到嵌入向量,可以使用更高级的模型,如循环神经网络(Recurrent Neural Networks,RNN)或 Transformer 模型。这些模型可以处理变长的输入序列,并捕捉更复杂的语义和句法关系。

总之,将单词映射到具体的向量需要使用适当的模型进行训练或使用预训练的模型。训练过程中,模型通过学习上下文信息和预测任务来生成有意义的嵌入向量。

向量数据是什么?

向量数据库是一种专门用于存储和查询向量数据的数据库系统。它提供了高效的索引和查询机制,旨在支持基于向量相似性的检索操作。

简单下个定义,因为喂给 Transformer 的知识首先需要做 embedding,所以用于存储 embedding 之后数据的数据库即可称为向量数据库。

传统的数据库系统主要针对结构化数据(如表格、行和列)进行存储和查询,而向量数据库专注于非结构化的向量数据,如嵌入向量、特征向量或描述符向量。这些向量数据通常用于表示图像、文本、音频、视频或其他类型的数据,可以用于相似性搜索、聚类、分类、推荐系统等任务。

向量数据库的关键特点是它们能够构建和维护高效的索引结构,以加速向量的相似性匹配。常见的索引结构包括 k-d 树、球树、倒排索引、哈希表等。这些索引结构可以快速过滤和定位与查询向量相似的向量数据,从而提高查询效率。

此外,向量数据库还提供了灵活的查询接口,使用户可以通过指定查询向量来搜索最相似的向量数据。相似性度量通常使用余弦相似度、欧氏距离、曼哈顿距离或其他相似性度量方法。

主流的向量数据库有哪些?

Pinecone: 是一个专门为工程师与开发者设计的向量数据库。 作为一个 全托管的服务,它减轻了工程师以及运维人员的负担,使得客户可以聚焦于数据内在价值的抽取。 免费版可以支持 500w 的向量存储,其用法简单,价格低廉,可以快速支持向量检索业务的验证与尝试。在特性上 Pinecone 也具有高速、准确以及可拓展等特性,此外也具备对单级元数据过滤和尖端稀疏-密集索引等高级功能。

Weaviate: 是一个开源的向量数据库,可以存储对象、向量,支持将矢量搜索与结构化过滤与云原生数据库容错和可拓展性等能力相结合。 支持 GraphQL、REST 和各种语言的客户端访问。

Qdrant: 是面向下一代的生成式AI向量数据库,同时也具备云原生的特性。

Milvus: 面向下一代的生成式 AI 向量数据库,支持云原生。

Chroma: 一个开源的向量数据库。 可以快速基于Python和JavaScript构建内存级LLM应用

具体的 Star 数量如下(2023/7/6):

数据库名称是否开源社区影响力编程语言核心特性适用场景
Pinecone未知向量存储与检索、全托管Saas类业务场景
weaviate6.3k starGo同时支持向量与对象的存储、支持向量检索与结构化过滤、具备主流模式成熟的使用案例。高速、灵活,不仅仅具备向量检索,还会支持推荐、总结等能力
qdrant11.5k starRust向量存储与检索、云原生、分布式、支持过滤、丰富的数据类型、WAL日志写入
milvus20.7k starGo极高的检索性能: 万亿矢量数据集的毫秒级搜索非结构化数据的极简管理丰富的API跨平台实时搜索和分析可靠:具有很高的容灾与故障转移能力高度可拓展与弹性支持混合检索统一的Lambda架构社区支持、行业认可
Chroma6.9k starpython轻量、内存级

综上所属, 在几个主流的向量数据库中, milvus 在大规模、检索性能、社区影响力等方面都具备绝对优势,其分布式架构也更 Match 下一代存储的理念。

Weaviate 在使用案例上,有很多现成的例子,跟当前 GPT 前沿热门项目贴合比较紧秘,但在大规模生产环境使用场景中,还需要接受考验。

Chroma是一个很轻量级的数据库,底层使用了 clickhouse、duckdb 等存储引擎

References